import java.util.HashSet;
import java.util.Set;

/**
 * @ClassName LC36
 * @Author ykx
 * @Date 2024/3/18 16:28
 * @Version 1.0
 */
public class LC36 {
    public static void main(String[] args) {
        LC36 lc36 = new LC36();
        char[][] board =
                {{'.', '.', '4', '.', '.', '.', '6', '3', '.'},
                        {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
                        {'5', '.', '.', '.', '.', '.', '.', '9', '.'},
                        {'.', '.', '.', '5', '6', '.', '.', '.', '.'},
                        {'4', '.', '3', '.', '.', '.', '.', '.', '1'},
                        {'.', '.', '.', '7', '.', '.', '.', '.', '.'},
                        {'.', '.', '.', '5', '.', '.', '.', '.', '.'},
                        {'.', '.', '.', '.', '.', '.', '.', '.', '.'},
                        {'.', '.', '.', '.', '.', '.', '.', '.', '.'}};
        System.out.println(lc36.isValidSudoku(board));
    }

    public boolean isValidSudoku(char[][] board) {
        for (char[] chars : board) {
            // 先判断每行是否符合要求
            Set<Character> rowSet = new HashSet<>();
            for (char c : chars) {
                if (c != '.' && !rowSet.add(c)) {
                    return false;
                }
            }
        }

        // 再判断列是否符合要求
        for (int i = 0; i < board.length; i++) {
            Set<Character> colSet = new HashSet<>();
            for (int j = 0; j < board[i].length; j++) {
                if (board[j][i] != '.' && !colSet.add(board[j][i])) {
                    return false;
                }
            }
        }

        // 九宫格
        int unit = (int) Math.sqrt(board.length);

        for (int x = 0; x < unit; x++) {
            for (int y = 0; y < unit; y++) {
                Set<Character> set = new HashSet<>();
                for (int i = x * unit; i < (x + 1) * unit; i++) {
                    for (int j = y * unit; j < (y + 1) * unit; j++) {
                        if (board[i][j] != '.' && !set.add(board[i][j])) {
                            return false;
                        }
                    }
                }
            }
        }


        return true;
    }
}
